/**
 * MBTI相关API接口
 */

/**
 * MBTI模块API
 * @param {Object} config - API配置信息
 * @returns {Object} - MBTI相关API方法集合
 */
module.exports = function(config) {
  // 定义重试配置
  const MAX_RETRIES = 3;  // 最大重试次数
  const RETRY_DELAY = 1000;  // 重试延迟时间（毫秒）
  
  // MBTI API路径
  const mbtiPaths = {
    userId: '/mbti/userid',
    version: '/mbti/version',
    result: '/mbti/result'
  };
  
  return {
    /**
     * 提交用户ID
     * @param {string} userId - 用户ID
     * @returns {Promise} - 提交结果
     */
    submitUserId: function(userId) {
      return new Promise((resolve, reject) => {
        function trySubmit(retryCount) {
          wx.request({
            url: config.getFullUrl(mbtiPaths.userId),
            method: 'POST',
            data: { userId },
            header: { 'Content-Type': 'application/json' },
            success: (res) => {
              if (res.statusCode === 200) {
                console.log('用户ID提交成功:', res.data);
                resolve(res.data);
              } 
              else if ((res.statusCode === 503 || res.statusCode === 502 || res.statusCode === 500) && retryCount < MAX_RETRIES) {
                console.warn(`服务器错误 (${res.statusCode})，${RETRY_DELAY/1000}秒后重试...`);
                setTimeout(() => trySubmit(retryCount + 1), RETRY_DELAY);
              } 
              else {
                console.error('用户ID提交失败:', res.statusCode);
                reject(res.data || { error: '服务器错误' });
              }
            },
            fail: (err) => {
              if (retryCount < MAX_RETRIES) {
                console.warn(`请求失败，${RETRY_DELAY/1000}秒后重试...`);
                setTimeout(() => trySubmit(retryCount + 1), RETRY_DELAY);
              } else {
                console.error('用户ID提交失败，已达到最大重试次数:', err);
                reject(err);
              }
            }
          });
        }
        
        // 开始第一次尝试
        trySubmit(0);
      });
    },
    
    /**
     * 提交测试版本信息
     * @param {string} userId - 用户ID
     * @param {string} versionId - 版本ID
     * @param {string} versionName - 版本名称
     * @returns {Promise} - 提交结果
     */
    submitVersionInfo: function(userId, versionId, versionName) {
      return new Promise((resolve, reject) => {
        function trySubmit(retryCount) {
          wx.request({
            url: config.getFullUrl(mbtiPaths.version),
            method: 'POST',
            data: { userId, versionId, versionName },
            header: { 'Content-Type': 'application/json' },
            success: (res) => {
              if (res.statusCode === 200) {
                if (res.data && res.data.success === false) {
                  console.warn('MBTI测试版本提交返回失败:', res.data.message);
                  // 尽管API返回失败，仍成功处理
                  resolve({ success: false, message: res.data.message });
                } else {
                  console.log('MBTI测试版本提交成功:', res.data);
                  resolve(res.data);
                }
              } 
              else if ((res.statusCode === 503 || res.statusCode === 502 || res.statusCode === 500) && retryCount < MAX_RETRIES) {
                console.warn(`服务器错误 (${res.statusCode})，${RETRY_DELAY/1000}秒后重试...`);
                setTimeout(() => trySubmit(retryCount + 1), RETRY_DELAY);
              } 
              else {
                console.error('MBTI测试版本提交失败:', res.statusCode);
                reject(res.data || { error: '服务器错误' });
              }
            },
            fail: (err) => {
              if (retryCount < MAX_RETRIES) {
                console.warn(`请求失败，${RETRY_DELAY/1000}秒后重试...`);
                setTimeout(() => trySubmit(retryCount + 1), RETRY_DELAY);
              } else {
                console.error('MBTI测试版本提交失败，已达到最大重试次数:', err);
                reject(err);
              }
            }
          });
        }
        
        // 开始第一次尝试
        trySubmit(0);
      });
    },
    
    /**
     * 提交测试结果
     * @param {string} userId - 用户ID
     * @param {string} mbtiType - MBTI类型
     * @param {Object} scoreDetails - 分数详情
     * @param {string} versionId - 版本ID
     * @returns {Promise} - 提交结果
     */
    submitTestResult: function(userId, mbtiType, scoreDetails, versionId) {
      return new Promise((resolve, reject) => {
        function trySubmit(retryCount) {
          wx.request({
            url: config.getFullUrl(mbtiPaths.result),
            method: 'POST',
            data: { userId, mbtiType, scoreDetails, versionId },
            header: { 'Content-Type': 'application/json' },
            success: (res) => {
              if (res.statusCode === 200) {
                if (res.data && res.data.success === false) {
                  console.warn('MBTI测试结果提交返回失败:', res.data.message);
                  resolve({ success: false, message: res.data.message });
                } else {
                  console.log('MBTI测试结果提交成功:', res.data);
                  resolve(res.data);
                }
              } 
              else if ((res.statusCode === 503 || res.statusCode === 502 || res.statusCode === 500) && retryCount < MAX_RETRIES) {
                console.warn(`服务器错误 (${res.statusCode})，${RETRY_DELAY/1000}秒后重试...`);
                setTimeout(() => trySubmit(retryCount + 1), RETRY_DELAY);
              } 
              else {
                console.error('MBTI测试结果提交失败:', res.statusCode);
                reject(res.data || { error: '服务器错误' });
              }
            },
            fail: (err) => {
              if (retryCount < MAX_RETRIES) {
                console.warn(`请求失败，${RETRY_DELAY/1000}秒后重试...`);
                setTimeout(() => trySubmit(retryCount + 1), RETRY_DELAY);
              } else {
                console.error('MBTI测试结果提交失败，已达到最大重试次数:', err);
                reject(err);
              }
            }
          });
        }
        
        // 开始第一次尝试
        trySubmit(0);
      });
    }
  };
}; 